<!DOCTYPE html>
<html lang="en-US">
    <head>
        <title>Test2::Aggregate - Aggregate tests for increased speed - metacpan.org</title>
        <link rel="preload" as="fetch" href="https://metacpan.org/account/login_status" crossorigin="anonymous" />
        <link href="https://metacpan.org/_assets/b8ccceeed47a0652049703d99326a9cea4933443.css" rel="stylesheet" type="text/css">
        <script src="https://metacpan.org/_assets/6bfedafe2d7caa915b7d84f61b45936818e3242e.js" type="text/javascript" defer></script>
        <link rel="alternate" type="application/rss+xml" title="Recent CPAN Uploads of Test2-Aggregate - MetaCPAN" href="https://metacpan.org/dist/Test2-Aggregate/releases.rss" />
        <link rel="canonical" href="./Test2::Aggregate.html" />
        <meta name="description" content="Aggregate tests for increased speed" />
        <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=5">
        <link rel="shortcut icon" href="https://metacpan.org/static/icons/favicon.ico">
        <link rel="apple-touch-icon" sizes="152x152" href="https://metacpan.org/static/icons/apple-touch-icon.png">
        <link rel="search" href="https://metacpan.org/static/opensearch.xml" type="application/opensearchdescription+xml" title="MetaCPAN">
        <script>
          (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
          (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
          m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
          })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

          (function(skey, ga_id){
            ga('create', ga_id, {
              siteSpeedSampleRate : 100,
              storage             : 'none',
              clientId            : localStorage.getItem(skey)
            });
            ga(function(tracker) {
              localStorage.setItem(skey, tracker.get('clientId'));
            });
            ga('send', 'pageview');
          })('ga:clientId', 'UA-27829474-1');
        </script>
<meta name="twitter:card"        content="summary" />
<meta name="twitter:url"         content="https://metacpan.org/pod/Test2::Aggregate" />
<meta name="twitter:title"       content="Test2::Aggregate" />
<meta name="twitter:description" content="Aggregate tests for increased speed" />
<meta name="twitter:site"        content="metacpan" />
    </head>
    <body>
        <nav class="navbar navbar-default" role="navigation">
            <div class="header-logo-large hidden-xs">
              <a href="https://metacpan.org/" tabindex="0">
                <svg class="logo" aria-label="MetaCPAN">
                  <use class="logo" href="/static/images/metacpan-logo.svg#logo" />
                </svg>
              </a>
            </div>
            <div class="header-logo-icon visible-xs">
              <a href="https://metacpan.org/">
                <svg class="logo" aria-label="MetaCPAN">
                  <use class="logo" href="/static/images/metacpan-logo.svg#dots" />
                </svg>
              </a>
            </div>
            <ul class="nav navbar-nav menu-items hidden-xs hidden-sm">
              <li><a href="https://metacpan.org/about">About</a></li>
              <li><a href="https://metacpan.org/about/sponsors">Sponsor</a></li>
              <li><a href="https://grep.metacpan.org/">grep::cpan</a></li>
              <li><a href="https://metacpan.org/recent">Recent</a></li>
              <li><a href="https://metacpan.org/about/faq">FAQ</a></li>
              <li><a href="https://metacpan.org/tools">Tools</a></li>
              <li><a href="https://fastapi.metacpan.org/">API</a></li>
            </ul>
            <ul class="nav navbar-nav navbar-right">
                <button type="button" class="searchbar-btn visible-xs visible-sm">
                    <i class="fa fa-search button-fa-icon"></i>
                </button>
                <form action="https://metacpan.org/search" class="searchbar-form visible-md visible-lg search-form form-horizontal">
                   <input type="hidden" name="size" id="metacpan_search-size" value="20">
                  <div class="form-group">
                      <div class="search-group">
                        <i class="fa fa-search"></i>
                        <input type="text" name="q" placeholder="Search the CPAN" size="41" autocorrect="off" autocapitalize="off" spellcheck="false" id="metacpan_search-input" class="form-control" value="">
                      </div>
                  </div>
                </form>
                    <li class="icon-slidepanel visible-xs visible-sm">
                      <button data-toggle="slidepanel" data-target=".slidepanel">
                        <span class="button-fa-icon">
                          <i class="fa fa-bars slidepanel-open"></i>
                          <i class="fa fa-times slidepanel-close"></i>
                        </span>
                      </button>
                    </li>
                <form action="https://metacpan.org/account/logout" method="POST" id="metacpan-logout"></form>
                <li class="dropdown logged_in" style="display: none;">
                    <button type="button" class="dropdown-toggle" data-toggle="dropdown">
                      <i class="fa fa-user button-fa-icon logged-in-icon" aria-hidden="true"></i>
                      <i class="fas fa-chevron-down"></i>
                    </button>
                    <ul class="dropdown-menu">
                        <li><a href="https://metacpan.org/account/identities">Identities</a></li>
                        <li><a href="https://metacpan.org/account/profile">Profile</a></li>
                        <li><a href="https://metacpan.org/account/favorite/list">Favorites</a></li>
                        <li>
                            <a href="./Test2::Aggregate.html#" type="button" onclick="$('#metacpan-logout').submit(); return false">
                              Logout
                            </a>
                        </li>
                    </ul>
                </li>
                <li class="dropdown logged_out" style="display: none;">
                    <button type="button" class="dropdown-toggle" data-toggle="dropdown">
                      <i class="fa fa-user button-fa-icon" aria-hidden="true"></i>
                      <i class="fas fa-chevron-down"></i>
                    </button>
                    <ul class="dropdown-menu">
                        <li>
                            <a href="https://metacpan.org/login/github">
                                <i class="fab fa-github fa-fw"></i>
                                GitHub
                            </a>
                        </li>
                        <li>
                            <a href="https://metacpan.org/login/twitter">
                                <i class="fab fa-twitter fa-fw"></i>
                                Twitter
                            </a>
                        </li>
                        <li>
                            <a href="https://metacpan.org/login/google">
                                <i class="fab fa-google fa-fw"></i>
                                Google
                            </a>
                        </li>
                    </ul>
                </li>
                <li class="dropdown logged_placeholder">
                    <button>
                      <i class="fa fa-user button-fa-icon" aria-hidden="true"></i>
                    </button>
                </li>
            </ul>
        </nav>
        <div class="page-content ">
          <!--
          <div class="top-notify-banner">
            <i class="fas fa-info-circle"></i>
          </div>
          -->
          <nav class="sidebar">
            <div class="slidepanel">
              <ul class="nav-list ">
    <li class="nav-header no-margin-top">
      <div class="ttip" data-toggle="tooltip" data-placement="bottom" title="The date that this version of Test2-Aggregate was released.">
      <span class="relatize">10 Feb 2022 17:16:42 UTC</span>
    </li>
  <li>
    Distribution: <a href="https://metacpan.org/dist/Test2-Aggregate">Test2-Aggregate</a>
  </li>
  <li>
    Module version: 0.17
  </li>
  <li>
    <a data-keyboard-shortcut="g s" href="https://metacpan.org/dist/Test2-Aggregate/source/lib/Test2/Aggregate.pm">Source</a>
    (<a href="https://metacpan.org/dist/Test2-Aggregate/source/lib/Test2/Aggregate.pm?raw=1">raw</a>)
  </li>
  <li>
    <a data-keyboard-shortcut="g b" href="https://metacpan.org/dist/Test2-Aggregate/source/lib/Test2">Browse</a>
    (<a href="https://metacpan.org/dist/Test2-Aggregate/source/lib/Test2?raw=1">raw</a>)
  </li>
    <li>
      <a data-keyboard-shortcut="g c" href="https://metacpan.org/dist/Test2-Aggregate/changes">Changes</a>
    </li>
    <li>
      <a class="nopopup" href="https://metacpan.org/dist/Test2-Aggregate/contribute">How to Contribute</a>
    </li>
    <li>
        <a rel="noopener nofollow" data-keyboard-shortcut="g r" href="https://github.com/SpareRoom/Test2-Aggregate">Repository</a>
    </li>
    <li>
      <a rel="noopener nofollow" data-keyboard-shortcut="g i" href="https://rt.cpan.org/Public/Dist/Display.html?Name=Test2-Aggregate">Issues</a>
      (0)
    </li>
    <li>
      <a rel="noopener nofollow" href="http://matrix.cpantesters.org/?dist=Test2-Aggregate+0.17" title="Matrix">Testers</a>
        <span title="(pass / fail / na)">(<a rel="noopener nofollow" href="https://www.cpantesters.org/distro/T/Test2-Aggregate.html?oncpan=1&amp;distmat=1&amp;version=0.17&amp;grade=2" style="color: #090">96</a> / <a rel="noopener nofollow" href="https://www.cpantesters.org/distro/T/Test2-Aggregate.html?oncpan=1&amp;distmat=1&amp;version=0.17&amp;grade=3" style="color: #900">0</a> / <a rel="noopener nofollow" href="https://www.cpantesters.org/distro/T/Test2-Aggregate.html?oncpan=1&amp;distmat=1&amp;version=0.17&amp;grade=4">0</a>)</span>
    </li>
    <li>
      <a rel="noopener nofollow" href="http://cpants.cpanauthors.org/release/DKECHAG/Test2-Aggregate-0.17">Kwalitee</a>
    </li>
    <li>
      <div class="ttip" data-toggle="tooltip" data-placement="bottom" title="The # people with an indexing permission on Test2-Aggregate who have released something to CPAN in the last 2 years (i.e. the # people likely able to release critical fixes in a timely manner)">
      Bus factor: 1
      </div>
    </li>
    <li>
      <a rel="noopener nofollow" href="http://cpancover.com/latest/Test2-Aggregate-0.17/index.html">100.00% Coverage </a>
    </li>
    <li>
      License: perl_5
    </li>
    <li>
      Perl: v5.8.0
    </li>
    <li class="nav-header">Activity</li>
    <li>
<div class="activity-graph">
    <img src="https://metacpan.org/dist/Test2-Aggregate/activity.svg?res=month" />
    <div class="comment">24 month</div>
</div>
    </li>
    <li class="nav-header">Tools</li>
    <li>
      <a itemprop="downloadUrl" href="https://cpan.metacpan.org/authors/id/D/DK/DKECHAG/Test2-Aggregate-0.17.tar.gz">
      Download (<span itemprop="fileSize">14.7KB</span>)</a>
    </li>
    <li>
      <a href="https://explorer.metacpan.org/?url=%2Fmodule%2FDKECHAG%2FTest2-Aggregate-0.17%2Flib%2FTest2%2FAggregate.pm">
        MetaCPAN Explorer
      </a>
    </li>
    <li>
      <a href="https://metacpan.org/dist/Test2-Aggregate/permissions">
        Permissions
      </a>
    </li>
    <li>
      <a href="https://metacpan.org/dist/Test2-Aggregate/releases.rss">
        Subscribe to distribution
      </a>
    </li>
    <li>
      <button class="btn btn-link" data-toggle="modal" data-target="#metacpan_install-instructions-dialog">
        Install Instructions
      </button>
    </li>
    <li>
      <form action="https://metacpan.org/search">
        <input type="hidden" name="q" value="dist:Test2-Aggregate">
        <input type="search" name="q" placeholder="Search distribution" class="form-control tool-bar-form">
        <input type="submit" style="display: none">
      </form>
    </li>
    <li>
      <form action="https://grep.metacpan.org/search">
        <input type="hidden" name="qd" value="Test2-Aggregate">
        <input type="hidden" name="source" value="metacpan">
        <input type="search" name="q" placeholder="grep distribution" class="form-control tool-bar-form">
        <input type="submit" style="display: none">
     </form>
    </li>
    <li class="version-jump">
<select onchange="document.location.href=&#39;/release/&#39;+this.value+&#39;/view/lib/Test2/Aggregate.pm&#39;" class="form-control tool-bar-form">
  <option disabled selected>Jump to version</option>
<option
  disabled
  value="DKECHAG/Test2-Aggregate-0.17"
>0.17
  (DKECHAG on 2022-02-10)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.16"
>0.16
  (DKECHAG on 2021-08-26)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.15"
>0.15
  (DKECHAG on 2020-08-10)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.14"
>0.14
  (DKECHAG on 2020-07-01)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.13"
>0.13
  (DKECHAG on 2020-06-27)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.12"
>0.12
  (DKECHAG on 2020-02-21)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.11"
>0.11
  (DKECHAG on 2019-12-04)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.10"
>0.10
  (DKECHAG on 2019-11-23)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.08"
>0.08
  (DKECHAG on 2019-07-05)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.07"
>0.07
  (DKECHAG on 2019-07-04)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.05"
>0.05
  (DKECHAG on 2019-06-21)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.04"
>0.04
  (DKECHAG on 2019-06-14)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.03"
>0.03
  (DKECHAG on 2019-06-10)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.01"
>0.01
  (DKECHAG on 2019-06-06)</option>
<optgroup label="BackPAN">'
<option
  
  value="DKECHAG/Test2-Aggregate-0.16_0"
>0.16_0 DEV
  (DKECHAG on 2021-08-25)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.13_1"
>0.13_1 DEV
  (DKECHAG on 2020-06-30)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.12_1"
>0.12_1 DEV
  (DKECHAG on 2020-06-26)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.11_3"
>0.11_3 DEV
  (DKECHAG on 2020-02-20)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.11_2"
>0.11_2 DEV
  (DKECHAG on 2020-02-19)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.11_1"
>0.11_1 DEV
  (DKECHAG on 2020-02-18)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.10_03"
>0.10_03 DEV
  (DKECHAG on 2019-11-28)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.10_02"
>0.10_02 DEV
  (DKECHAG on 2019-11-27)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.10_01"
>0.10_01 DEV
  (DKECHAG on 2019-11-27)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.09_3"
>0.09_3 DEV
  (DKECHAG on 2019-11-22)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.09_2"
>0.09_2 DEV
  (DKECHAG on 2019-11-22)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.09"
>0.09
  (DKECHAG on 2019-11-22)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.06"
>0.06
  (DKECHAG on 2019-07-04)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.02"
>0.02
  (DKECHAG on 2019-06-10)</option>
</optgroup>
</select>
    </li>
    <li class="version-diff">
<select onchange="document.location.href='/release/DKECHAG/Test2-Aggregate-0.17/diff/' + encodeURIComponent(this.value) + '/lib/Test2/Aggregate.pm'
" class="form-control tool-bar-form">
  <option disabled selected>Diff with version</option>
<option
  disabled
  value="DKECHAG/Test2-Aggregate-0.17"
>0.17
  (DKECHAG on 2022-02-10)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.16"
>0.16
  (DKECHAG on 2021-08-26)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.15"
>0.15
  (DKECHAG on 2020-08-10)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.14"
>0.14
  (DKECHAG on 2020-07-01)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.13"
>0.13
  (DKECHAG on 2020-06-27)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.12"
>0.12
  (DKECHAG on 2020-02-21)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.11"
>0.11
  (DKECHAG on 2019-12-04)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.10"
>0.10
  (DKECHAG on 2019-11-23)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.08"
>0.08
  (DKECHAG on 2019-07-05)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.07"
>0.07
  (DKECHAG on 2019-07-04)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.05"
>0.05
  (DKECHAG on 2019-06-21)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.04"
>0.04
  (DKECHAG on 2019-06-14)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.03"
>0.03
  (DKECHAG on 2019-06-10)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.01"
>0.01
  (DKECHAG on 2019-06-06)</option>
<optgroup label="BackPAN">'
<option
  
  value="DKECHAG/Test2-Aggregate-0.16_0"
>0.16_0 DEV
  (DKECHAG on 2021-08-25)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.13_1"
>0.13_1 DEV
  (DKECHAG on 2020-06-30)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.12_1"
>0.12_1 DEV
  (DKECHAG on 2020-06-26)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.11_3"
>0.11_3 DEV
  (DKECHAG on 2020-02-20)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.11_2"
>0.11_2 DEV
  (DKECHAG on 2020-02-19)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.11_1"
>0.11_1 DEV
  (DKECHAG on 2020-02-18)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.10_03"
>0.10_03 DEV
  (DKECHAG on 2019-11-28)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.10_02"
>0.10_02 DEV
  (DKECHAG on 2019-11-27)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.10_01"
>0.10_01 DEV
  (DKECHAG on 2019-11-27)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.09_3"
>0.09_3 DEV
  (DKECHAG on 2019-11-22)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.09_2"
>0.09_2 DEV
  (DKECHAG on 2019-11-22)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.09"
>0.09
  (DKECHAG on 2019-11-22)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.06"
>0.06
  (DKECHAG on 2019-07-04)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.02"
>0.02
  (DKECHAG on 2019-06-10)</option>
</optgroup>
</select>
    </li>

    <li>
<ul class="dependencies">
  <li class="nav-header">Dependencies</li>
  <li><a href="./Path::Tiny.html" title="Path::Tiny" class="ellipsis">Path::Tiny</a></li>
  <li><a href="https://metacpan.org/pod/Test2::V0" title="Test2::V0" class="ellipsis">Test2::V0</a></li>
  <li><i class="ttip" title="dynamic_config enabled">and possibly others</i></li>
  <li>
    <hr>
  </li>
  <li>
    <a href="https://metacpan.org/module/Test2::Aggregate/requires">Reverse dependencies</a>
  </li>
  <li>
    <a href="http://deps.cpantesters.org/?module=Test2%3A%3AAggregate">CPAN Testers List</a>
  </li>
  <li>
    <a href="https://cpandeps.grinnz.com/?dist=Test2-Aggregate">Dependency graph</a>
  </li>
</ul>
    </li>
    <li class="nav-header">Permalinks</li>
    <li>
      <a href="https://metacpan.org/release/DKECHAG/Test2-Aggregate-0.17/view/lib/Test2/Aggregate.pm">This version</a>
    </li>
    <li>
      <a href="./Test2::Aggregate.html">Latest version</a>
    </li>
    <li>
<div class="plussers">
<div class="nav-header">++ed by:</div>
<div>
<a class="display-all" href="https://metacpan.org/author/VEESH"><img src="https://www.gravatar.com/avatar/5ec5a5223fe6ee8e96b03dca47b670ea?d=identicon&amp;s=20" title="VEESH" alt="VEESH"></a>
</div>
<!-- Display counts of plussers-->
<div>
    <a href="https://metacpan.org/dist/Test2-Aggregate/plussers">1 PAUSE user</a>
</div>
</div>
    </li>
    <li>
    </li>
              </ul>
            </div>
          </nav>
          <div class="content-navigation">
<div class="breadcrumbs">
  <span>
    <a data-keyboard-shortcut="g a" rel="author" href="https://metacpan.org/author/DKECHAG" class="author-name">Dimitrios Kechagias</a>
  </span>
  <span>&nbsp;/&nbsp;</span>
  <div class="release dist-release status-latest maturity-released">
    <span class="dropdown"><b class="caret"></b></span>
<select onchange="document.location.href=&#39;/release/&#39;+this.value+&#39;/view/lib/Test2/Aggregate.pm&#39;" class="">
<option
  selected
  value="DKECHAG/Test2-Aggregate-0.17"
>0.17
  (DKECHAG on 2022-02-10)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.16"
>0.16
  (DKECHAG on 2021-08-26)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.15"
>0.15
  (DKECHAG on 2020-08-10)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.14"
>0.14
  (DKECHAG on 2020-07-01)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.13"
>0.13
  (DKECHAG on 2020-06-27)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.12"
>0.12
  (DKECHAG on 2020-02-21)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.11"
>0.11
  (DKECHAG on 2019-12-04)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.10"
>0.10
  (DKECHAG on 2019-11-23)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.08"
>0.08
  (DKECHAG on 2019-07-05)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.07"
>0.07
  (DKECHAG on 2019-07-04)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.05"
>0.05
  (DKECHAG on 2019-06-21)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.04"
>0.04
  (DKECHAG on 2019-06-14)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.03"
>0.03
  (DKECHAG on 2019-06-10)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.01"
>0.01
  (DKECHAG on 2019-06-06)</option>
<optgroup label="BackPAN">'
<option
  
  value="DKECHAG/Test2-Aggregate-0.16_0"
>0.16_0 DEV
  (DKECHAG on 2021-08-25)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.13_1"
>0.13_1 DEV
  (DKECHAG on 2020-06-30)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.12_1"
>0.12_1 DEV
  (DKECHAG on 2020-06-26)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.11_3"
>0.11_3 DEV
  (DKECHAG on 2020-02-20)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.11_2"
>0.11_2 DEV
  (DKECHAG on 2020-02-19)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.11_1"
>0.11_1 DEV
  (DKECHAG on 2020-02-18)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.10_03"
>0.10_03 DEV
  (DKECHAG on 2019-11-28)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.10_02"
>0.10_02 DEV
  (DKECHAG on 2019-11-27)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.10_01"
>0.10_01 DEV
  (DKECHAG on 2019-11-27)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.09_3"
>0.09_3 DEV
  (DKECHAG on 2019-11-22)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.09_2"
>0.09_2 DEV
  (DKECHAG on 2019-11-22)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.09"
>0.09
  (DKECHAG on 2019-11-22)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.06"
>0.06
  (DKECHAG on 2019-07-04)</option>
<option
  
  value="DKECHAG/Test2-Aggregate-0.02"
>0.02
  (DKECHAG on 2019-06-10)</option>
</optgroup>
</select>
    <a data-keyboard-shortcut="g d" class="release-name" href="https://metacpan.org/dist/Test2-Aggregate">Test2-Aggregate-0.17</a>
  </div>
<span class="river-gauge-gauge">
  <svg width="24px"
       height="15px"
       version="1.1"
       xmlns="http://www.w3.org/2000/svg"
       xmlns:xlink="http://www.w3.org/1999/xlink">

    <g>
      <title>        River stage zero &#10;
          No dependents
      </title>

      <rect x="0"  y="0" width="4" height="15" fill="#e4e2e2" />
      <rect x="5"  y="0" width="4" height="15" fill="#e4e2e2" />
      <rect x="10"  y="0" width="4" height="15" fill="#e4e2e2" />
      <rect x="15"  y="0" width="4" height="15" fill="#e4e2e2" />
      <rect x="20"  y="0" width="4" height="15" fill="#e4e2e2" />
    </g>
  </svg>

</span>
<div id="Test2-Aggregate-fav" class="logged_in">
<form action="https://metacpan.org/account/favorite/add" style="display: inline" onsubmit="return favDistribution(this)">
    <input type="hidden" name="remove" value="0">
    <input type="hidden" name="release" value="Test2-Aggregate-0.17">
    <input type="hidden" name="author" value="DKECHAG">
    <input type="hidden" name="distribution" value="Test2-Aggregate">
    <button type="submit" class="favorite highlight"><span>1</span> ++</button>
</form>
</div>
<div class="logged_out">
<a href="./Test2::Aggregate.html" onclick="alert('Please sign in to add favorites'); return false" class="favorite highlight">
<span>1</span> ++</a>
</div>
   / <span>Test2::Aggregate</span>
</div>
          </div>
          <main class="content">


<nav class="toc">
  <div class="toc-header"><strong>Contents</strong></div>
<ul>
  <li><a href="./Test2::Aggregate.html#NAME">NAME</a></li>
  <li><a href="./Test2::Aggregate.html#SYNOPSIS">SYNOPSIS</a></li>
  <li><a href="./Test2::Aggregate.html#VERSION">VERSION</a></li>
  <li><a href="./Test2::Aggregate.html#DESCRIPTION">DESCRIPTION</a></li>
  <li><a href="./Test2::Aggregate.html#METHODS">METHODS</a>
    <ul>
      <li><a href="./Test2::Aggregate.html#run_tests">run_tests</a></li>
    </ul>
  </li>
  <li><a href="./Test2::Aggregate.html#USAGE-NOTES">USAGE NOTES</a>
    <ul>
      <li><a href="./Test2::Aggregate.html#Test::More">Test::More</a></li>
      <li><a href="./Test2::Aggregate.html#BEGIN-/-END-Blocks">BEGIN / END Blocks</a></li>
      <li><a href="./Test2::Aggregate.html#Test::Class">Test::Class</a></li>
      <li><a href="./Test2::Aggregate.html#$ENV%7BAGGREGATE_TESTS%7D">$ENV{AGGREGATE_TESTS}</a></li>
      <li><a href="./Test2::Aggregate.html#Example-aggregating-strategy">Example aggregating strategy</a></li>
    </ul>
  </li>
  <li><a href="./Test2::Aggregate.html#AUTHOR">AUTHOR</a></li>
  <li><a href="./Test2::Aggregate.html#BUGS">BUGS</a></li>
  <li><a href="./Test2::Aggregate.html#GIT">GIT</a></li>
  <li><a href="./Test2::Aggregate.html#COPYRIGHT-&amp;-LICENSE">COPYRIGHT &amp; LICENSE</a></li>
</ul></nav>
<div class="pod anchors">
<h1 id="NAME">NAME</h1>

<p>Test2::Aggregate - Aggregate tests for increased speed</p>

<h1 id="SYNOPSIS">SYNOPSIS</h1>

<pre><code>    use Test2::Aggregate;
    use Test2::V0; # Or &#39;use Test::More&#39; etc if your suite uses an other framework

    Test2::Aggregate::run_tests(
        dirs =&gt; \@test_dirs
    );

    done_testing();</code></pre>

<h1 id="VERSION">VERSION</h1>

<p>Version 0.17</p>

<h1 id="DESCRIPTION">DESCRIPTION</h1>

<p>Aggregates all tests specified with <code>dirs</code> (which can even be individual tests) to avoid forking, reloading etc. that can help with performance (dramatically if you have numerous small tests) and also facilitate group profiling. It is quite common to have tests that take over a second of startup time for milliseconds of actual runtime - <a href="./Test2::Aggregate.html">Test2::Aggregate</a> removes that overhead. Test files are expected to end in <b>.t</b> and are run as subtests of a single aggregate test.</p>

<p>A bit similar (mainly in intent) to <a href="./Test::Aggregate.html">Test::Aggregate</a>, but no inspiration was drawn from the specific module, so simpler in concept and execution, which makes it much more likely to work with your test suite (especially if you use modern tools like <a href="./Test2::Suite.html">Test2::Suite</a>). It does not even try to package each test by default (there is an option), which may be good or bad, depending on your requirements.</p>

<p>Generally, the way to use this module is to try to aggregate sets of quick tests (e.g. unit tests). Try to iteratively add tests to the aggregator, using the <code>lists</code> option, so you can easily edit and remove those that do not work. Trying an entire, large, suite in one go is not a good idea, as an incompatible test can break the run making the subsequent tests fail (especially when doing things like globally redefining built-ins etc.) - see the module usage notes for help.</p>

<p>The module can work with <a href="https://metacpan.org/pod/Test::Builder">Test::Builder</a> / <a href="https://metacpan.org/pod/Test::More">Test::More</a> suites, but you will have less issues with <a href="./Test2::Suite.html">Test2::Suite</a> (see notes).</p>

<h1 id="METHODS">METHODS</h1>

<h2 id="run_tests"><code>run_tests</code></h2>

<pre><code>    my $stats = Test2::Aggregate::run_tests(
        dirs          =&gt; \@dirs,              # optional if lists defined
        lists         =&gt; \@lists,             # optional if dirs defined
        exclude       =&gt; qr/exclude_regex/,   # optional
        include       =&gt; qr/include_regex/,   # optional
        root          =&gt; &#39;/testroot/&#39;,        # optional
        load_modules  =&gt; \@modules,           # optional
        package       =&gt; 0,                   # optional
        shuffle       =&gt; 0,                   # optional
        sort          =&gt; 0,                   # optional
        reverse       =&gt; 0,                   # optional
        unique        =&gt; 1,                   # optional
        repeat        =&gt; 1,                   # optional, requires Test2::Plugin::BailOnFail for &lt; 0
        slow          =&gt; 0,                   # optional
        override      =&gt; \%override,          # optional, requires Sub::Override
        stats_output  =&gt; $stats_output_path,  # optional
        extend_stats  =&gt; 0,                   # optional
        test_warnings =&gt; 0,                   # optional
        allow_errors  =&gt; 0,                   # optional
        pre_eval      =&gt; $code_to_eval,       # optional
        dry_run       =&gt; 0,                   # optional
        slurp_param   =&gt; {binmode =&gt; $mode}   # optional
    );</code></pre>

<p>Runs the aggregate tests. Returns a hashref with stats like this:</p>

<pre><code>  $stats = {
    &#39;test.t&#39; =&gt; {
      &#39;test_no&#39;   =&gt; 1,                 # numbering starts at 1
      &#39;pass_perc&#39; =&gt; 100,               # for single runs pass/fail is 100/0
      &#39;timestamp&#39; =&gt; &#39;20190705T145043&#39;, # start of test
      &#39;time&#39;      =&gt; &#39;0.1732&#39;,          # seconds - only with stats_output
      &#39;warnings&#39;  =&gt; $STDERR            # only with test_warnings on non empty STDERR
    }
  };</code></pre>

<p>The parameters to pass:</p>

<ul>

<li><p><code>dirs</code> (either this or <code>lists</code> is required)</p>

<p>An arrayref containing directories which will be searched recursively, or even individual tests. The directories (unless <code>shuffle</code> or <code>reverse</code> are true) will be processed and tests run in order specified. Test files are expected to end in <code>.t</code>.</p>

</li>
<li><p><code>lists</code> (either this or <code>dirs</code> is required)</p>

<p>Arrayref of flat files from which each line will be pushed to <code>dirs</code> (so they have a lower precedence - note <code>root</code> still applies, don&#39;t include it in the paths inside the list files). If the path does not exist, it will currently be silently ignored, however the &quot;official&quot; way to skip a line without checking it as a path is to start with a <code>#</code> to denote a comment.</p>

<p>This option is nicely combined with the <code>--exclude-list</code> option of <code>yath</code> (the <a href="./Test2::Harness.html">Test2::Harness</a>) to skip the individual runs of the tests you aggregated.</p>

</li>
<li><p><code>exclude</code> (optional)</p>

<p>A regex to filter out tests that you want excluded.</p>

</li>
<li><p><code>include</code> (optional)</p>

<p>A regex which the tests have to match in order to be included in the test run. Applied after <code>exclude</code>.</p>

</li>
<li><p><code>root</code> (optional)</p>

<p>If defined, must be a valid root directory that will prefix all <code>dirs</code> and <code>lists</code> items. You may want to set it to <code>&#39;./&#39;</code> if you want dirs relative to the current directory and the dot is not in your <code>@INC</code>.</p>

</li>
<li><p><code>load_modules</code> (optional)</p>

<p>Arrayref with modules to be loaded (with <code>eval &quot;use ...&quot;</code>) at the start of the test. Useful for testing modules with special namespace requirements.</p>

</li>
<li><p><code>package</code> (optional)</p>

<p>Will package each test in its own namespace. While it may help avoid things like redefine warnings, from experience, it can break some tests, so it is disabled by default.</p>

</li>
<li><p><code>override</code> (optional)</p>

<p>Pass <a href="https://metacpan.org/pod/Sub::Override">Sub::Override</a> compatible key/values as a hashref.</p>

</li>
<li><p><code>repeat</code> (optional)</p>

<p>Number of times to repeat the test(s) (default is 1 for a single run). If <code>repeat</code> is negative, <a href="https://metacpan.org/pod/Test2::Plugin::BailOnFail">Test2::Plugin::BailOnFail</a> is required, as the tests will repeat until they bail on a failure. It can be combined with <code>test_warnings</code> in which case a warning will also cause the test run to end.</p>

</li>
<li><p><code>unique</code> (optional)</p>

<p>From v0.11, duplicate tests are by default removed from the running list as that could mess up the stats output. You can still define it as false to allow duplicate tests in the list.</p>

</li>
<li><p><code>sort</code> (optional)</p>

<p>Sort tests alphabetically if set to true. Provides a way to fix the test order across systems.</p>

</li>
<li><p><code>shuffle</code> (optional)</p>

<p>Random order of tests if set to true. Will override <code>sort</code>.</p>

</li>
<li><p><code>reverse</code> (optional)</p>

<p>Reverse order of tests if set to true.</p>

</li>
<li><p><code>slow</code> (optional)</p>

<p>When true, tests will be skipped if the environment variable <code>SKIP_SLOW</code> is set.</p>

</li>
<li><p><code>test_warnings</code> (optional)</p>

<p>Tests for warnings over all the tests if set to true - this is added as a final test which expects zero as the number of tests which had STDERR output. The STDERR output of each test will be printed at the end of the test run (and included in the test run result hash), so if you want to see warnings the moment they are generated leave this option disabled.</p>

</li>
<li><p><code>allow_errors</code> (optional)</p>

<p>If enabled, it will allow errors that exit tests prematurely (so they may return a pass if one of their subtests had passed). The option is available to enable old behaviour (version &lt;= 0.12), before the module stopped allowing this.</p>

</li>
<li><p><code>dry_run</code> (optional)</p>

<p>Instead of running the tests, will do <code>ok($testname)</code> for each one. Otherwise, test order, stats files etc. will be produced (as if all tests passed).</p>

</li>
<li><p><code>slurp_param</code> (optional)</p>

<p>If you are using list files, by default, <code>Path::Tiny::slurp_utf8</code> will be used to read them. If you would like to use <code>slurp</code> with your own parameters instead, like a UTF16 binmode etc, you can pass them here.</p>

</li>
<li><p><code>pre_eval</code> (optional)</p>

<p>String with code to run with eval before each test. You might be inclined to do this for example:</p>

<pre><code>  pre_eval =&gt; &quot;no warnings &#39;redefine&#39;;&quot;</code></pre>

<p>You might expect it to silence redefine warnings (when you have similarly named subs on many tests), but even if you don&#39;t set warnings explicitly in your tests, most test bundles will set warnings automatically for you (e.g. for <a href="https://metacpan.org/pod/Test2::V0">Test2::V0</a> you&#39;d have to do <code>use Test2::V0 -no_warnings =&gt; 1;</code> to avoid it).</p>

</li>
<li><p><code>stats_output</code> (optional)</p>

<p><code>stats_output</code> specifies a path where a file will be created to print out running time per test (average if multiple iterations) and passing percentage. Output is sorted from slowest test to fastest. On negative <code>repeat</code> the stats of each successful run will be written separately instead of the averages. The name of the file is <code>caller_script-YYYYMMDDTHHmmss.txt</code>. If <code>&#39;-&#39;</code> is passed instead of a path, then the output will be written to STDOUT. The timing stats are useful because the test harness doesn&#39;t normally measure time per subtest (remember, your individual aggregated tests become subtests). If you prefer to capture the hash output of the function and use that for your reports, you still need to define <code>stats_output</code> to enable timing (just send the output to <code>/dev/null</code>, <code>/tmp</code> etc).</p>

</li>
<li><p><code>extend_stats</code> (optional)</p>

<p>This option exist to make the default output format of <code>stats_output</code> be fixed, but still allow additions in future versions that will only be written with the <code>extend_stats</code> option enabled. Additions with <code>extend_stats</code> as of the current version:</p>

<ul>

<p>- starting date/time in ISO_8601.</p>

</ul>

</li>
</ul>

<h1 id="USAGE-NOTES"><a id="USAGE"></a>USAGE NOTES</h1>

<p>Not all tests can be modified to run under the aggregator, it is not intended for tests that require an isolated environment, do overrides etc. For other tests which can potentially run under the aggregator, sometimes very simple changes may be needed like giving unique names to subs (or not warning for redefines, or trying the package option), replacing things that complain, restoring the environment at the end of the test etc.</p>

<p>Unit tests are usually great for aggregating. You could use the hash that <code>run_tests</code> returns in a script that tries to add more tests automatically to an aggregate list to see which added tests passed and keep them, dropping failures. See later in the notes for a detailed example.</p>

<p>Trying to aggregate too many tests into a single one can be counter-intuitive as you would ideally want to parallelize your test suite (so a super-long aggregated test continuing after the rest are done will slow down the suite). And in general more tests will run aggregated if they are grouped so that tests that can&#39;t be aggregated together are in different groups.</p>

<p>In general you can call <code>Test2::Aggregate::run_tests</code> multiple times in a test and even load <code>run_tests</code> with tests that already contain another <code>run_tests</code>, the only real issue with multiple calls is that if you use <code>repeat &lt; 0</code> on a call, <a href="https://metacpan.org/pod/Test2::Plugin::BailOnFail">Test2::Plugin::BailOnFail</a> is loaded so any subsequent failure, on any following <code>run_tests</code> call will trigger a Bail.</p>

<h2 id="Test::More"><a id="Test"></a>Test::More</h2>

<p>If you haven&#39;t switched to the <a href="./Test2::Suite.html">Test2::Suite</a> you are generally advised to do so for a number of reasons, compatibility with this module being only a very minor one. If you are stuck with a <a href="https://metacpan.org/pod/Test::More">Test::More</a> suite, <a href="./Test2::Aggregate.html">Test2::Aggregate</a> can still probably help you more than the similarly-named <code>Test::Aggregate...</code> modules.</p>

<p>Although the module tries to load <code>Test2</code> with minimal imports to not interfere, it is generally better to do <code>use Test::More;</code> in your aggregating test (i.e. alongside with <code>use Test2::Aggregate</code>).</p>

<h2 id="BEGIN-/-END-Blocks"><a id="BEGIN"></a><a id="BEGIN---END-Blocks"></a>BEGIN / END Blocks</h2>

<p><code>BEGIN</code> / <code>END</code> blocks will run at the start/end of each test and any overrides etc you might have set will apply to the rest of the tests, so if you use them you probably need to make changes for aggregation. An example of such a change is when you have a <code>*GLOBAL::CORE::exit</code> override to test scripts that can call <code>exit()</code>. A solution is to use something like <a href="https://metacpan.org/pod/Test::Trap">Test::Trap</a>:</p>

<pre><code> BEGIN {
     unless ($Test::Trap::VERSION) { # Avoid warnings for multiple loads in aggregation
         require Test::Trap;
         Test::Trap-&gt;import();
     }
 }</code></pre>

<h2 id="Test::Class"><a id="Test1"></a>Test::Class</h2>

<p><a href="./Test::Class.html">Test::Class</a> is sort of an aggregator itself. You make your tests into modules and then load them on the same <code>.t</code> file, so ideally you will not end up with many <code>.t</code> files that would require further aggregation. If you do, due to the <a href="./Test::Class.html">Test::Class</a> implementation specifics, those <code>.t</code> files won&#39;t run under <a href="https://metacpan.org/pod/Test2::Aggregator">Test2::Aggregator</a>.</p>

<h2 id="$ENV{AGGREGATE_TESTS}"><a id="ENV-AGGREGATE_TESTS"></a>$ENV{AGGREGATE_TESTS}</h2>

<p>The environment variable <code>AGGREGATE_TESTS</code> will be set while the tests are running for your convenience. Example usage is making a test you know cannot run under the aggregator check and croak if it was run under it, or a module that can only be loaded once, so you load it on the aggregated test file and then use something like this in the individual test files:</p>

<pre><code> eval &#39;use My::Module&#39; unless $ENV{AGGREGATE_TESTS};</code></pre>

<p>If you have a custom test bundle, you could use the variable to do things like disable warnings on redefines only for tests that run aggregated:</p>

<pre><code> use Import::Into;

 sub import {
    ...
    &#39;warnings&#39;-&gt;unimport::out_of($package, &#39;redefine&#39;)
        if $ENV{AGGREGATE_TESTS};
 }</code></pre>

<p>Another idea is to make the test die when it is run under the aggregator, if, at design time, you know it is not supposed to run aggregated.</p>

<h2 id="Example-aggregating-strategy"><a id="Example"></a>Example aggregating strategy</h2>

<p>There are many approaches you could do to use <code>Test2::Aggregate</code> with an existing test suite, so for example you can start by making a list of the test files you are trying to aggregate:</p>

<pre><code> find t -name &#39;*.t&#39; &gt; all.lst</code></pre>

<p>If you have a substantial test suite, perhaps try with a portion of it (a subdir?) instead of the entire suite. In any case, try running them aggregated like this:</p>

<pre><code> use Test2::Aggregate;
 use Test2::V0; # Or Test::More;

 my $stats = Test2::Aggregate::run_tests(
    lists =&gt; [&#39;all.lst&#39;],
 );

 open OUT, &quot;&gt;pass.lst&quot;;
 foreach my $test (sort {$stats-&gt;{$a}-&gt;{test_no} &lt;=&gt; $stats-&gt;{$b}-&gt;{test_no}} keys %$stats) {
     print OUT &quot;$test\n&quot; if $stats-&gt;{$test}-&gt;{pass_perc};
 }
 close OUT;

 done_testing();</code></pre>

<p>Run the above with <code>prove</code> or <code>yath</code> in verbose mode, so that in case the run hangs (it can happen), you can see where it did so and edit <code>all.lst</code> removing the offending test.</p>

<p>If the run completes, you have a &quot;starting point&quot; - i.e. a list that can run under the aggregator in <code>pass.lst</code>. You can try adding back some of the failed tests - test failures can be cascading, so some might be passing if added back, or have small issues you can address.</p>

<p>Try adding <code>test_warnings =&gt; 1</code> to <code>run_tests</code> to fix warnings as well, unless it is common for your tests to have <code>STDERR</code> output.</p>

<p>To have your entire suite run aggregated tests together once and not repeat them along with the other, non-aggregated, tests, it is a good idea to use the <code>--exclude-list</code> option of the <code>Test2::Harness</code>.</p>

<p>Hopefully your tests can run in parallel (<code>prove/yath -j</code>), in which case you would split your aggregated tests into multiple lists to have them run in parallel. Here is an example of a wrapper around <code>yath</code>, to easily handle multiple lists:</p>

<pre><code> BEGIN {
     my @args = ();
     foreach (@ARGV) {
         if (/--exclude-lists=(\S+)/) {
             my $all = &#39;t/aggregate/aggregated.tests&#39;;
             `awk &#39;{print &quot;t/&quot;\$0}&#39; $1 &gt; $all`;
             push @args, &quot;--exclude-list=$all&quot;;
         } else { push @args, $_ if $_; }
     }
     push @args, qw(-P...) # Preload module list (useful for non-aggregated tests)
         unless grep {/--cover/} @args;
     @ARGV = @args;
 }
 exec (&#39;yath&#39;, @ARGV);</code></pre>

<p>You would call it with something like <code>--exclude-lists=t/aggregate/*.lst</code>, and the tests listed will be excluded (you will have them running aggregated through their own <code>.t</code> files using <a href="./Test2::Aggregate.html">Test2::Aggregate</a>).</p>

<h1 id="AUTHOR">AUTHOR</h1>

<p>Dimitrios Kechagias, <code>&lt;dkechag at cpan.org&gt;</code></p>

<h1 id="BUGS">BUGS</h1>

<p>Please report any bugs or feature requests to <code>bug-test2-aggregate at rt.cpan.org</code>, or through the web interface at <a href="https://rt.cpan.org/NoAuth/ReportBug.html?Queue=Test2-Aggregate">https://rt.cpan.org/NoAuth/ReportBug.html?Queue=Test2-Aggregate</a>. I will be notified, and then you&#39;ll automatically be notified of progress on your bug as I make changes. You could also submit issues or even pull requests to the github repo (see below).</p>

<h1 id="GIT">GIT</h1>

<p><a href="https://github.com/SpareRoom/Test2-Aggregate">https://github.com/SpareRoom/Test2-Aggregate</a></p>

<h1 id="COPYRIGHT-&amp;-LICENSE"><a id="COPYRIGHT"></a><a id="COPYRIGHT---LICENSE"></a>COPYRIGHT &amp; LICENSE</h1>

<p>Copyright (C) 2019, SpareRoom.com</p>

<p>This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.</p></div>

<div id="metacpan_install-instructions-dialog" class="modal fade">
  <div class="modal-dialog">
    <div class="modal-content">
      <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
        <h4 class="modal-title">Module Install Instructions</h4>
      </div>
      <div class="modal-body">
        <p>To install Test2::Aggregate, copy and paste the appropriate command in to your terminal.</p>
        <p><a href="https://metacpan.org/dist/App-cpanminus/view/bin/cpanm">cpanm</a></p>
        <pre><code>cpanm Test2::Aggregate</code></pre>
        <p><a href="https://metacpan.org/pod/CPAN">CPAN shell</a></p>
        <pre><code>perl -MCPAN -e shell
install Test2::Aggregate</code></pre>
        <p>For more information on module installation, please visit <a href="https://www.cpan.org/modules/INSTALL.html">the detailed CPAN module installation guide</a>.</p>
      </div>
      <div class="modal-footer">
        <a href="./Test2::Aggregate.html#" data-dismiss="modal" class="btn">Close</a>
      </div>
    </div>
  </div>
</div>
          </main>
          <div class="content-pagination">
          </div>
        </div>
        <footer class="footer">
          <div class="footer-container">
            <div class="footer-social">
              <div class="footer-link footer-logo">
                <a href="https://metacpan.org/">
                  <img src="https://metacpan.org/static/images/metacpan-logo.svg" alt="MetaCPAN" />
                </a>
              </div>
              <a class="footer-social-link" href="https://github.com/metacpan">
                <i class="fab fa-github-square"></i>
              </a>
              <a class="footer-social-link" href="https://fosstodon.org/@metacpan">
                <i class="fab fa-mastodon"></i>
              </a>
            </div>
            <div class="footer-links">
              <div class="footer-link">
                  <a href="https://metacpan.org/about">About</a>
              </div>
              <div class="footer-link">
                  <a href="https://metacpan.org/about/sponsors">Sponsor</a>
              </div>
              <div class="footer-link">
                  <a href="https://grep.metacpan.org">grep::cpan</a>
              </div>
              <div class="footer-link">
                  <a href="https://metacpan.org/recent">Recent</a>
              </div>
              <div class="footer-link">
                  <a href="https://metacpan.org/about/faq">FAQ</a>
              </div>
              <div class="footer-link">
                  <a href="https://metacpan.org/tools">Tools</a>
              </div>
              <div class="footer-link">
                  <a href="https://fastapi.metacpan.org/">API</a>
              </div>
              <div class="footer-link">
                  <a href="https://www.perl.org/">Perl.org</a>
              </div>
            </div>
            <div class="footer-sponsors">
              <a class="footer-sponsor-link" target="_blank" href="https://www.bytemark.co.uk/" rel="noopener">
                <img class="footer-sponsor-bytemark" src="https://metacpan.org/static/images/sponsors/bytemark_logo.svg" alt="Bytemark logo">
              </a>
              <a class="footer-sponsor-link" target="_blank" href="https://www.liquidweb.com/" rel="noopener">
                <img class="footer-sponsor-liquidweb" src="https://metacpan.org/static/images/sponsors/liquidweb_logo.png" alt="liquidweb logo">
              </a>
              <a class="footer-sponsor-link" target="_blank" href="https://deriv.com/careers/" rel="noopener">
                <img class="footer-sponsor-deriv" src="https://metacpan.org/static/images/sponsors/deriv.svg" alt="Deriv logo">
              </a>
              <a class="footer-sponsor-link" target="_blank" href="https://geocode.xyz" rel="noopener">
                <img class="footer-sponsor-geocode" src="https://metacpan.org/static/images/sponsors/geocodelogo.svg" alt="Geocode logo">
              </a>
              <a class="footer-sponsor-link" target="_blank" href="https://www.fastly.com/" rel="noopener">
                <img class="footer-sponsor-fastly" src="https://metacpan.org/static/images/sponsors/fastly_logo.svg" alt="Fastly logo">
              </a>
              <a class="footer-sponsor-link" target="_blank" href="https://opencagedata.com" rel="noopener">
                <img class="footer-sponsor-opencage" src="https://metacpan.org/static/images/sponsors/open-cage.svg" alt="OpenCage logo">
              </a>
            </div>
          </div>
        </footer>
        <div class="modal fade" tabindex="-1" role="dialog" id="metacpan_keyboard-shortcuts">
          <div class="modal-dialog">
            <div class="modal-content">
              <div class="modal-header">
                <button type="button" class="close" data-dismiss="modal">&times;</button>
                <h4 class="modal-title">Keyboard Shortcuts</h4>
              </div>
              <div class="modal-body row">
<div class="col-md-6">
  <table class="table keyboard-shortcuts">
    <thead>
      <tr>
        <th></th>
        <th>Global</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td class="keys">
          <kbd>s</kbd>
        </td>
        <td>Focus search bar</td>
      </tr>
      <tr>
        <td class="keys">
          <kbd>?</kbd>
        </td>
        <td>Bring up this help dialog</td>
      </tr>
    </tbody>
  </table>

  <table class="table keyboard-shortcuts">
    <thead>
      <tr>
        <th></th>
        <th>GitHub</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td class="keys">
          <kbd>g</kbd> <kbd>p</kbd>
        </td>
        <td>Go to pull requests</td>
      </tr>
      <tr>
        <td class="keys">
          <kbd>g</kbd> <kbd>i</kbd>
        </td>
        <td>go to github issues (only if github is preferred repository)</td>
      </tr>
    </tbody>
  </table>
</div>

<div class="col-md-6">
  <table class="table keyboard-shortcuts">
    <thead>
      <tr>
        <th></th>
        <th>POD</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td class="keys">
          <kbd>g</kbd> <kbd>a</kbd>
        </td>
        <td>Go to author</td>
      </tr>
      <tr>
        <td class="keys">
          <kbd>g</kbd> <kbd>c</kbd>
        </td>
        <td>Go to changes</td>
      </tr>
      <tr>
        <td class="keys">
          <kbd>g</kbd> <kbd>i</kbd>
        </td>
        <td>Go to issues</td>
      </tr>
      <tr>
        <td class="keys">
          <kbd>g</kbd> <kbd>d</kbd>
        </td>
        <td>Go to dist</td>
      </tr>
      <tr>
        <td class="keys">
          <kbd>g</kbd> <kbd>r</kbd>
        </td>
        <td>Go to repository/SCM</td>
      </tr>
      <tr>
        <td class="keys">
          <kbd>g</kbd> <kbd>s</kbd>
        </td>
        <td>Go to source</td>
      </tr>
      <tr>
        <td class="keys">
          <kbd>g</kbd> <kbd>b</kbd>
        </td>
        <td>Go to file browse</td>
      </tr>

    </tbody>
  </table>
</div>

<div class="col-md-12">
  <table class="table keyboard-shortcuts">
    <thead>
      <tr>
        <th></th>
        <th>Search terms</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td><em>module:</em> (e.g. <a href="https://metacpan.org/search?q=module%3APlugin">module:Plugin</a>)</td>
      </tr>
      <tr>
        <td><em>distribution:</em> (e.g. <a href="https://metacpan.org/search?q=distribution%3ADancer+auth">distribution:Dancer auth</a>)</td>
      </tr>
      <tr>
        <td><em>author:</em> (e.g. <a href="https://metacpan.org/search?q=author%3ASONGMU+Redis">author:SONGMU Redis</a>)</td>
      </tr>
      <tr>
        <td><em>version:</em> (e.g. <a href="https://metacpan.org/search?q=version%3A1.00">version:1.00</a>)</td>
      </tr>
    </tbody>
  </table>
</div>
              </div>
              <div class="modal-footer"></div>
            </div>
          </div>
        </div>
    </body>
</html>
